//
//  MLLazyLoadTableView.h
//  TycoonBuy
//
//  Created by molon on 16/4/18.
//  Copyright © 2016年 molon. All rights reserved.
//

#import <UIKit/UIKit.h>

@class ModelArray,MolonRequestHelper;
@class MLLazyLoadTableViewCell;

@protocol MLLazyLoadTableViewDelegate <NSObject,UITableViewDelegate>
@end

@protocol MLLazyLoadTableViewDataSource <NSObject,UITableViewDataSource>
@end

@interface MLLazyLoadTableView : UITableView

/**
 *  UITableViewDelegate的代理delegate，注意在外部的dealloc方法(例如viewController里)需要手动设置此delegate为nil
 */
@property (nonatomic, weak) id<MLLazyLoadTableViewDelegate> proxyDelegate;

/**
 *  UITableViewDataSource的代理delegate，注意在外部的dealloc方法(例如viewController里)需要手动设置此delegate为nil
 */
@property (nonatomic, weak) id<MLLazyLoadTableViewDataSource> proxyDataSource;

/**
 *  当前列表中已存在的数据
 */
@property (nonatomic, strong) ModelArray *data;

/**
 *  是否处于刷新中状态
 */
@property (nonatomic, assign, readonly) BOOL refreshing;

/**
 *  最后做懒加载提示的cell
 */
@property (nonatomic, strong, readonly) MLLazyLoadTableViewCell *lazyLoadCell;

/**
 *  当前懒加载tableView所关心的section
 */
@property (nonatomic, assign, readonly) NSInteger refreshSection;

/**
 *  当前懒加载tableView所关心的section的头部所忽略的rowCount
 */
@property (nonatomic, assign, readonly) NSInteger exceptTopRowCount;

/**
 *  最后一次调用的请求
 */
@property (nonatomic, strong, readonly) MolonRequestHelper *lastRequestHelper;

/**
 *  请求block,根据是否是refreshing去获取下一页的还是第一页的，需要返回此请求对象
 */
@property (nonatomic, copy) MolonRequestHelper *(^requestBlock)(MLLazyLoadTableView *tableView,BOOL refreshing);

/**
 *  刷新失败后会调用
 */
@property (nonatomic, copy) void(^refreshFailedBlock)(MLLazyLoadTableView *tableView,MolonRequestHelper *requestHelper);

/**
 *  在reloadData之后执行，只会在.m里doReloadDataWithCompletion方法。并不是只要reloadData就会调用
 */
@property (nonatomic, copy) void(^afterReloadDataBlock)(MLLazyLoadTableView *tableView);

//下面是可主动调用的方法
/**
 *  根据支持刷新的section初始化
 *
 *  @param refreshSection 需要支持刷新的section，默认为0
 *  @param exceptTopRowCount 除去的头部几行，不参与懒加载数据
 *
 *  @return 对象
 */
- (instancetype)initWithRefreshSection:(NSInteger)refreshSection exceptTopRowCount:(NSInteger)exceptTopRowCount;

/**
 *  根据支持刷新的section和exceptTopRowCount初始化
 *
 *  @param refreshSection    需要支持刷新的section，默认为0
 *  @param exceptTopRowCount 除去的头部几行，不参与懒加载数据
 *  @param lazyLoadCell      自定义懒加载cell，为nil时候会使用默认的
 *
 *  @return 实例
 */
- (instancetype)initWithRefreshSection:(NSInteger)refreshSection exceptTopRowCount:(NSInteger)exceptTopRowCount lazyLoadCell:(MLLazyLoadTableViewCell*)lazyLoadCell;

/**
 *  默认下拉刷新是不启用的，需要主动打开，至于打开的时机应是在 viewDidAppear 里
 */
- (void)enablePullDownRefresh;

/**
 *  清空列表和重置数据
 */
- (void)reset;

/**
 *  执行refresh，如果不启用下拉刷新，需要手动调用此方法开始刷新
 */
- (void)doRefresh;

/**
 *  请求结束之后，需要主动告诉是否成功以及是否已经加载了全部的数据用以停止懒加载
 *
 *  @param requestHelper 对应的请求对象
 *  @param success       是否请求成功
 *  @param loadedAll     是否加载了全部数据
 */
- (void)requestCompletedWithRequestHelper:(MolonRequestHelper *)requestHelper success:(BOOL)success pageData:(ModelArray*)pageData loadedAll:(BOOL)loadedAll;

/**
 *  懒加载行的index，一般在tableView的一些外部delegate里需要通过这个判断下是否是懒加载行来过滤
 *
 *  @return 懒加载行的index
 */
- (NSInteger)lazyLoadIndex;

/**
 *  懒加载行的indexPath，一般在tableView的一些外部delegate里需要通过这个判断下是否是懒加载行来过滤
 *
 *  @return 懒加载行的indexPath
 */
- (NSIndexPath*)lazyLoadIndexPath;

/**
 *  行数目
 *
 *  @return 行数目
 */
- (NSInteger)rowCount;


@end
